#ifndef TDASERVIDORINSEGURO_H_
#define TDASERVIDORINSEGURO_H_

/* Este TDA representa un servidor que recibe y entrega los correos a traves de un canal inseguro */
/* Salvo en la primitiva de creacion, se asume como PRE para todas las primitivas que el servidor esta creado */
/* En todas las primitivas se asume en forma implicita que el primer parametro es una variable del tipo del TDA */

#include "TDACorreo.h"
#include "TDACola.h"
#include "TDAServerLog.h"
#include "TDAPila.h"
#include "TDA_DNS.h"
/* Macros para definir el tipo de informacion almacenada por el log. */
#define SENDED_MAIL 1
#define RCVD_MAIL 2

/* Macro para establecer la maxima cantidad de correos en el server*/
#define MAX_CORREOS_SERV 20

/* Macro para definir el estado de "Sin mensajes". */
#define NO_MESSAGES 1

#define MAX_DOMINIO 100

#define MAX_QTY_DOMINIOS 100
#define MAX_DOMINIO_SIZE 100


/* Definicion del tipo de dato de los logs*/
typedef struct {

    char remitente[MAX_ADDR_SIZE];
    int tipoData;
    time_t fechaHora;
    char asunto[MAX_SUBJECT_SIZE];

} TDAServerLog;

/* Definicion del tipo de dato del server */
typedef struct {

    TDACorreo correo[MAX_CORREOS_SERV];
    int cantidadCorreos;
    char destOrig[MAX_CORREOS_SERV][MAX_QTY_DEST][MAX_ADDR_SIZE];
    int qtyEventos;
    TPila pilaLog;
    char dominio[MAX_DOMINIO];
    TDA_DNS *DNS;

} TDAServidorInseguro;

/*
 * Descripcion: Agrega la informacion de envio/recibimiento de email en el server
 * Pre.: Servidor creado.
 * Post.: Se agrego al log del server la informacion enviada
 */
 void addDataToLog(TDAServidorInseguro* servidor, time_t fechaHora, char* asunto, char* remitente, int tipoData);


/*
 * Descripcion: Escribe en el archivo un registro de todos los correos electronicos
 * recibidos y entregados por el servidor.
 *
 * Precondiciones: Servidor creado y archivo abierto con permisos de escritura.
 *
 * Postcondiciones: Se escribio en el archivo una linea por cada correo recibido o
 * entregado por el servidor. Ver formato en la seccion siguiente.
 *
 */
int escribirLog(TDAServidorInseguro servidor, FILE* archivo);



/*
 * Crea el servidor
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: N/A
 * POST: se ha creado el servidor
 *
 */
void crearServidor(TDAServidorInseguro* servidor,char* dominio,TDA_DNS *DNS);

/*
 * Destruye el servidor
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: N/A
 * POST: el servidor se ha destruido (y cualquier correo almacenado se ha eliminado)
 *
 */
void destruirServidor(TDAServidorInseguro* servidor);

/*
 * Agrega un correo a ser entregado por el servidor
 *
 * Parametros:
 * correo	un correo valido a agregar
 *
 * Valor de retorno:
 * 0 si el correo fue agregado exitosamente
 * 1 si el correo no pudo ser agregado
 *
 * PRE: correo es un correo valido
 * POST: el correo se ha agregado al servidor
 *
 */
int agregarCorreo(TDAServidorInseguro* servidor, TDACorreo correo);

/*
 * Obtiene el proximo correo del servidor dirigido al destinatario especificado
 *
 * Parametros:
 * destinatario	un char* que apunta a una cadena de texto con la direccion de correo del destinatario del mensaje a ser obtenido
 * correo		un puntero a una zona de memoria valida con espacio suficiente para contener un correo
 *
 * Valor de retorno:
 * 0 si se ha podido recibir un correo
 * 1 si no habia correos para obtener
 * 2 si ocurrio un error al intentar obtener un correo
 *
 * PRE: destinatario apunta a una zona de memoria valida con espacio suficiente para contener MAX_ADDR_SIZE caracteres y ademas el caracter terminador de cadena
 * 		correo apunta a una zona de memoria valida con especio suficiente para contener un correo
 * POST: se ha recibido un nuevo correo que puede obtenerse a partir del parametro correo provisto
 *
 */
int obtenerProximoCorreo(TDAServidorInseguro* servidor, char* destinatario, TDACorreo* correo);

/*
 * Descripcion: Devuelve los correos no recibidos del destinatario.
 *
 * Precondiciones: Servidor creado, dest es una cadena de caracteres valida de
 * longitud maxima MAX ADDR SIZE, correos es una cola creada para elementos de
 * tamano sizeof(TCorreo).
 *
 * Postcondiciones: Los mensajes no leidos del destinatario fueron puestos en la cola
 * en el mismo orden en que fueron enviados. Se marcaron los mensajes como
 * recibidos por el destinatario.
 */
int obtenerCorreos(TDAServidorInseguro *servidor, char *dest, TCola *correos);


/*
 * Descripcion: Obtiene la cantidad de correos almacenados en el server.
 * Pre: Servidor creado.
 * Post: Se ha devuelto por interfase la cantidad de correos.
 */
int getCantidadCorreos(TDAServidorInseguro servidor);


/*
 * Descripcion: Escribe los logs del server en el archivo indicado.
 * Pre: Archivo abierto con permisos de escritura, servidor creado.
 * Post: Se ha impreso en el archivo la informacion del log del server.
 */
int escribirLog(TDAServidorInseguro servidor, FILE* archivo);


/* ***************************************************/
void extraerDominio(char* direccion,char* dominio);


/* ****************************************************/
#endif /*TDASERVIDORINSEGURO_H_*/
